Loading...

정확히 배낭의 크기만큼 담아야하는 독특한 배낭 문제

13910번: 개업 (acmicpc.net) n그릇의 요리를 해야하는데 가지고 있는 도구 크기들이 주어질때,  주어진 도구를 사용할때는 정확히 해당 크기만큼 요리해야한다면 n그릇을 만들기 위해 최소 몇번 요리해야하는지 예를 들어 1그릇, 3그릇용 도구가 주어지면 3그릇용 도구로 2그릇을 요리하지는 않고,  1그릇용 도구만 사용하여 1그릇만 요리할 수도 있고 1그릇, 3그릇 도구를 동시에 써서 4그릇을 요리할 수도 있다 또한 4그릇을 만들어야할때, 5그릇을 만들지 않는다  배낭문제처럼 dp[i] = i그릇 요리를 만들기 위해 해야하는 최소 요리 수 0그릇 요리에는 당연히 0번이면 되니까 dp[0] = 0 i = 1,2,3,...,n에 대하여 j번째 도구를 사용할때, k = j+1,j+2,...,m-1번째 ..

선택한 원소의 인접한 원소는 선택할 수 없을 때 원소 합을 최대로 선택하는 방법

7265번: Herbamedžiai (acmicpc.net)  배열에서 i번째 원소를 선택하면 i-1번째, i+1번째 원소는 선택할 수 없을때, 선택할 수 있는 원소의 최대 합을 구한다면 n이 최대 10만이라 O(N)에는 해결해줘야한다 $O(N^{2})$ 아니면 못할것 같지만 놀랍게도 O(N)에 되더라고 DP[i] = i번째 원소까지 봤을때 선택한 원소들의 최대합 만약 i번째 원소를 선택하지 않는다면? dp[i] = dp[i-1]로 그대로 가져오면 된다 만약 i번째 원소를 선택한다면? i-1번째 원소는 선택할 수 없으므로, dp[i-2]에다가 i번째 원소 선택 A[i]를 더해주면 된다 dp[i] = dp[i-2] + A[i] 여기서 둘 중 더 큰 값을 고르면 된다 dp[i] = max(dp[i-1], d..

홀수 길이의 연속 부분 배열의 합 중 가장 큰 값을 구하는 방법

19355번: A Really Odd Sequence (acmicpc.net) 주어진 배열에서 길이가 홀수인 연속 부분 배열의 원소 합 중 가장 큰 값을 구하는 문제 https://deepdata.tistory.com/390 다이나믹 프로그래밍 - Kadane algorithm1. 문제 https://www.acmicpc.net/problem/1912 1912번: 연속합첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거deepdata.tistory.com 카데인 알고리즘의 연장선상이긴 한데 문제는 홀수 길이여야한다는 것... 카데인 알고리즘은 배열의 길이를 모른다.. 길이 정보를 담자니...

index와 value를 바꾸는 다이나믹 프로그래밍 트릭

E - Maximum Glutton (atcoder.jp) E - Maximum GluttonAtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.atcoder.jp 단맛이 a 짠맛이 b로 주어지는 n개의 음식을 먹는데  단맛이 x를 초과하거나 짠맛이 y를 초과하는 순간 음식을 그만 먹는다면 음식을 최대한 많이 먹고자할때, 최대로 먹을 수 있는 음식의 수는? 전형적인 배낭 문제라서 dp[i][j][k] = i번째 음식까지 먹었을때 단맛의 합이 j, 짠맛의 합이 k인 경우 먹은 최대 음식의 수로  하면 될것 같다고 생각을 했는데 n이 80이고 a가 ..

배열에서 일부를 골라 공차가 매우 큰 등차수열이 되도록 만드는 방법의 수

E - Count Arithmetic Subsequences (atcoder.jp) E - Count Arithmetic SubsequencesAtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.atcoder.jp  배열 A에서 일부를 골라 길이가 i = 1,2,3,..,n인 등차수열을 만드는 방법의 수를 각각 구하는 문제 dp[i][j][d]을 길이가 j이고 공차가 d이며 등차수열의 끝 항이 A[i]인 등차수열을 만드는 방법의 수라고 해보자. 길이가 j-1이고 끝항이 A[k], k = 0,1,2,..,i-1인 모든 등차수열을 조사하여 A[i] ..

다이나믹 프로그래밍을 이용한 partition minimum sum of difference of two subset(합의 차이가 최소가 되는 분할) 문제 해법

1. 문제 배열 A가 주어질때, A를 2개의 부분집합으로 분할하고자 하는데, 각 부분집합의 원소의 합이 X,Y이면 abs(X-Y)가 최소가 되도록 분할하고자 한다 이때, 그 최솟값을 구하거나 X,Y를 구하는 문제 A의 원소의 합이 total = sum(A)라면, 두 부분집합의 원소 합의 차이가 최소가 되는 것은 정확히 절반이 되는 경우이다. 그러니까 최대 target = total//2에 도달하는게 가장 좋다. 1) dp[i] = A의 원소를 일부 골라서 합했을때, i가 될 수 있는가? 만약 i-w를 만들 수 있다면, w를 더하면 i가 될 수 있으므로 dp[i-w] = 1이면 dp[i] = 1이 된다. #dp[i] = 배열 v의 원소를 일부 골라 합해서 i를 만들 수 있는가?target = total//..